﻿using System;
using System.Collections.Generic;
using System.Web.UI.WebControls;
using MIAP.Entidades;
using MIAP.Negocio;
using MIAPWEB.Common;

namespace MIAPWEB.Forms
{
    /// <summary>
    /// Clase de la vista Actualización de Versión Válida.
    /// </summary>
    public partial class ActualizaVersion : PageBase
    {
        #region Campos

        /// <summary>
        /// Clase de negocio de las operaciones de Comunes.
        /// </summary>
        private ComunesNegocio comunesNegocio;

        /// <summary>
        /// Clase de negocio para las operaciones de actualización de versión de archivo.
        /// </summary>
        private ActualizacionVersionNegocio actualizacionVersionNegocio;

        /// <summary>
        /// Clase de negocio para las operaciones de solicitud de recarga de archivo.
        /// </summary>
        private SolicitudRecargaNegocio solicitudRecargaNegocio;

        #endregion

        #region Propiedades

        /// <summary>
        ///  Obtiene o establece el archivo versionado.
        /// </summary>
        public ActualizacionVersionInfo ArchivoVersionado
        {
            get
            {
                return (ActualizacionVersionInfo)this.ViewState["ArchivoVersionado"];
            }

            set
            {
                this.ViewState["ArchivoVersionado"] = value;
            }
        }

        /// <summary>
        /// Obtiene o establece los registros resultantes de la búsqueda.
        /// </summary>
        private IList<ActualizacionVersionInfo> DataSourceVersion
        {
            get
            {
                if (this.ViewState["DataSourceVersion"] == null)
                {
                    this.ViewState["DataSourceVersion"] = new List<ActualizacionVersionInfo>();
                }

                return this.ViewState["DataSourceVersion"] as List<ActualizacionVersionInfo>;
            }

            set
            {
                this.ViewState["DataSourceVersion"] = value;
            }
        }

        #endregion

        #region Constructor

        /// <summary>
        /// Inicializa una instancia de <see cref="ActualizaVersion"/>
        /// </summary>
        public ActualizaVersion()
        {
            this.comunesNegocio = new ComunesNegocio();           
            this.actualizacionVersionNegocio = new ActualizacionVersionNegocio();
            this.solicitudRecargaNegocio = new SolicitudRecargaNegocio();
        }

        #endregion

        #region Eventos

        /// <summary>
        /// Evento que se ejecuta al cargar la página.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void Page_Load(object sender, EventArgs e)
        {
            this.grdVersiones.PageSize = Convert.ToInt32(new ConfiguracionNegocio().GetNumeroPaginasGrid().Descripcion);
            if (!this.IsPostBack)
            {
                this.ArchivoVersionado = new ActualizacionVersionInfo();

                this.GetProyectos();
                this.GetArchivosByProyecto(-1);
                this.GetMeses();
                this.GetAños();

                this.Search();
            }
        }

        /// <summary>
        /// Método ejecutado al dar click al botón buscar. Obtiene los archivos versionabels
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void btnBuscar_Click(object sender, EventArgs e)
        {
            this.Search();
            this.CleanSelection();
        }

        /// <summary>
        /// Método ejecutado al dar click al botón actualizar versión válida. Modifica la versión válida por la actualmente seleccionada en el grid.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void btnActualizarVersion_Click(object sender, EventArgs e)
        {
            if (this.ArchivoVersionado.IdArchivo != default(int) && this.ArchivoVersionado.IdArchivo != null)
            {
                this.actualizacionVersionNegocio.EditVersionValida(this.ArchivoVersionado, AppSessionManager.Instance.Usuario);

                this.Refresh();

                this.CleanSelection();
            }
            else
            {
                this.ShowMessage(this.GetGlobalResourceObject("Strings", "ErrorSeleccionarElemento").ToString());
            }
        }

        /// <summary>
        /// Método ejecutado al dar click al botón salir. Redirecciona a la página principal.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void btnSalir_Click(object sender, EventArgs e)
        {
            Response.Redirect(Common.AppUrls.Default);
        }

        /// <summary>
        /// Método ejecutado al modificar la selección del dropdownlist Proyectos. Obtiene los archivos relacionados con el proyecto seleccionado.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void ddlProyecto_SelectedIndexChanged(object sender, EventArgs e)
        {
            DropDownList dropProyecto = (DropDownList)sender;

            int idProyecto = int.Parse(dropProyecto.SelectedValue);

            this.GetArchivosByProyecto(idProyecto);
        }

        /// <summary>
        /// Método ejecutado al seleccionar un elemento del grid. Obtiene el elemento seleccionado.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void grdVersiones_SelectedIndexChanged(object sender, EventArgs e)
        {
            GridViewRow row = ((GridView)sender).SelectedRow;

            var dataKeys = this.grdVersiones.DataKeys[((GridView)sender).SelectedIndex];

            this.ArchivoVersionado.IdUsuario = AppSessionManager.Instance.IdUsuario;
            this.ArchivoVersionado.IdCargaArchivo = int.Parse(dataKeys[0].ToString());
            this.ArchivoVersionado.IdArchivo = int.Parse(dataKeys[1].ToString());
            this.ArchivoVersionado.NombreArchivo = row.Cells[5].Text;
            this.ArchivoVersionado.Año = int.Parse(row.Cells[7].Text);
            this.ArchivoVersionado.Mes = int.Parse(dataKeys[2].ToString());
            this.ArchivoVersionado.Version = Server.HtmlDecode(row.Cells[11].Text).Trim();
            this.ArchivoVersionado.IndicadorVersionValida = bool.Parse(dataKeys[3].ToString());
            this.ArchivoVersionado.IdBitacoraGeneral = int.Parse(dataKeys[4].ToString());
        }

        /// <summary>
        /// Evento que se ejecuta cuando se cambia de página en el grid.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void grdVersiones_OnPageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            grdVersiones.PageIndex = e.NewPageIndex;
            this.grdVersiones.DataSource = this.DataSourceVersion;
            this.grdVersiones.DataBind();
        }
        #endregion

        #region Métodos

        /// <summary>
        /// Obtiene los proyectos.
        /// </summary>
        public void GetProyectos()
        {
            this.ddlProyecto.DataSource = AppSessionManager.Instance.GetProyectosByPagina(AppUrls.ActualizacionVersionValida);
            this.ddlProyecto.DataBind();
            this.comunesNegocio.SetTodos(this.GetGlobalResourceObject("strings", "Todos").ToString(), this.ddlProyecto);
        }

        /// <summary>
        /// Obtiene todos los archivos relacionados a un proyecto.
        /// </summary>
        /// <param name="idProyecto">Id de proyecto.</param>
        private void GetArchivosByProyecto(int idProyecto)
        {
            this.ddlArchivo.DataSource = this.solicitudRecargaNegocio.GetArchivosByUsuarioProyecto(idProyecto, null);
            this.ddlArchivo.DataBind();
            this.comunesNegocio.SetTodos(this.GetGlobalResourceObject("strings", "Todos").ToString(), this.ddlArchivo);
        }

        /// <summary>
        /// Obtiene los meses.
        /// </summary>
        private void GetMeses()
        {
            this.ddlMes.DataSource = this.comunesNegocio.GetMeses();
            this.ddlMes.DataBind();
            this.comunesNegocio.SetTodos(this.GetGlobalResourceObject("strings", "Todos").ToString(), this.ddlMes);
        }

        /// <summary>
        /// Obtiene una lista de 10 años a partir del actual.
        /// </summary>
        private void GetAños()
        {
            this.ddlAño.DataSource = this.comunesNegocio.GetAños();
            this.ddlAño.DataBind();
            this.comunesNegocio.SetTodos(this.GetGlobalResourceObject("strings", "Todos").ToString(), this.ddlAño);
        }

        /// <summary>
        /// Obtiene los archivos versionables.
        /// </summary>
        private void GetArchivosVersionablesByFilters()
        {
            this.DataSourceVersion = this.actualizacionVersionNegocio.GetArchivosVersionables(this.ArchivoVersionado);
            this.grdVersiones.DataSource = this.DataSourceVersion;
            this.grdVersiones.DataBind();
        }

        private void Search()
        {
            this.GetFilters();
            this.GetArchivosVersionablesByFilters();
        }

        /// <summary>
        /// Obtiene los filtros.
        /// </summary>
        private void GetFilters()
        {
            this.ArchivoVersionado.IdProyecto = ddlProyecto.SelectedValue == this.comunesNegocio.ValorTodos ? this.ArchivoVersionado.IdProyecto = null : int.Parse(ddlProyecto.SelectedValue);
            this.ArchivoVersionado.IdArchivo = ddlArchivo.SelectedValue == this.comunesNegocio.ValorTodos ? this.ArchivoVersionado.IdArchivo = null : int.Parse(ddlArchivo.SelectedValue);
            this.ArchivoVersionado.Año = ddlAño.SelectedValue == this.comunesNegocio.ValorTodos ? this.ArchivoVersionado.Año = null : int.Parse(ddlAño.SelectedValue);
            this.ArchivoVersionado.Mes = ddlMes.SelectedValue == this.comunesNegocio.ValorTodos ? this.ArchivoVersionado.Mes = null : int.Parse(ddlMes.SelectedValue);
        }

        /// <summary>
        /// Refresca los controles.
        /// </summary>
        public void Refresh()
        {
            this.ArchivoVersionado = new ActualizacionVersionInfo();
            this.GetArchivosVersionablesByFilters();
        }

        /// <summary>
        /// Limpia la selección del grid.
        /// </summary>
        public void CleanSelection()
        {
            this.grdVersiones.SelectedIndex = -1;
            this.ArchivoVersionado = new ActualizacionVersionInfo();           
        }

        #endregion      
    }
}